/**
在TypeScript中，泛型允许开发者在定义函数、类或接口时传入多个类型参数，从而实现更灵活和可复用的代码。以下是关于传入多个类型的泛型使用说明总结：
  1. 多个类型参数的基本概念
  - 泛型可以接受多个类型参数，通过逗号分隔来定义。这样可以使函数、类或接口能够处理多种类型的数据。

  2. 泛型函数的多个类型参数
  - 在泛型函数中，可以定义多个类型参数，使得函数能够接受不同类型的参数。

    例如：
  function combine<T, U>(a: T, b: U): [T, U] {
      return [a, b];
  }

  const result = combine<string, number>("Hello", 123); // result 的类型为 [string, number]
  3. 泛型接口的多个类型参数
  - 泛型接口也可以定义多个类型参数，以支持更复杂的数据结构。

    例如：
  interface Pair<K, V> {
      key: K;
      value: V;
  }

  const pair: Pair<string, number> = {
      key: "age",
      value: 30
  };
  4. 泛型类的多个类型参数
  - 泛型类可以使用多个类型参数，使类能够处理多种类型的数据。

    例如：
  class Dictionary<K, V> {
      private items: { [key: string]: V } = {};

      set(key: K, value: V) {
          this.items[JSON.stringify(key)] = value;
      }

      get(key: K): V | undefined {
          return this.items[JSON.stringify(key)];
      }
  }

  const dict = new Dictionary<number, string>();
  dict.set(1, "One");
  console.log(dict.get(1)); // 输出: "One"
  5. 约束多个类型参数
  - 通过约束，可以限制泛型参数的类型范围。可以为每个类型参数设置不同的约束。

    例如：
  interface Lengthwise {
      length: number;
  }

  function logPairLength<K extends Lengthwise, V extends Lengthwise>(pair: [K, V]): void {
      console.log(`Key length: ${pair[0].length}, Value length: ${pair[1].length}`);
  }

  logPairLength([{ length: 3 }, { length: 5 }]); // 合法
  6. 总结
  通过传入多个类型参数，TypeScript的泛型特性提供了更高的灵活性和可复用性。开发者可以定义更复杂的函数、接口和类，以适应不同的数据类型和结构。这种方式不仅提高了代码的可读性，还增强了类型安全性，减少了潜在的错误。
 */
function foo<T, E>(arg1, arg2) {
  console.log(arg1, arg2)
}

foo(20, 'abc')
foo(10, "abc")
foo<string, { name: string }>("abc", { name: "why" })

export {}
